<?php
/**
 * FTP客户端类
 * 支持FTP空间文件上传和删除
 * 
 * @package CommonCloudStorage
 * @author xiaogg
 * @version 1.0
 */

if (!defined('ZBP_PATH')) {
    exit('Access denied');
}

/**
 * FTP上传文件 - 改进版，完全接管主程序上传
 */
function CommonCloudStorage_FTP_Upload($cloudPath, $localFile, $config) {
    try {
        $ftpHost = $config['bucket_name']; // FTP模式下bucket_name存储IP地址
        $ftpUser = $config['access_key'];
        $ftpPass = $config['secret_key'];
        $ftpPort = 21; // 默认FTP端口
        
        // 解析主机和端口
        if (strpos($ftpHost, ':') !== false) {
            list($ftpHost, $ftpPort) = explode(':', $ftpHost, 2);
        }
        
        // 建立FTP连接
        $conn = ftp_connect($ftpHost, $ftpPort, 30);
        if (!$conn) {
            throw new Exception('无法连接到FTP服务器: ' . $ftpHost . ':' . $ftpPort);
        }
        
        // 登录FTP
        if (!ftp_login($conn, $ftpUser, $ftpPass)) {
            ftp_close($conn);
            throw new Exception('FTP登录失败');
        }
        
        // 设置被动模式
        ftp_pasv($conn, true);
        
        // 处理目录参数 - 如果配置了目录，自动拼接
        $remoteFile = $cloudPath;
        if (!empty($config['directory'])) {
            $directory = trim($config['directory'], '/');
            if (!empty($directory)) {
                $remoteFile = $directory . '/' . $remoteFile;
        }
        }
        
        // 创建远程目录 - 自动检测并创建不存在的目录
        $remoteDir = dirname($remoteFile);
        if ($remoteDir !== '.' && $remoteDir !== '') {
            CommonCloudStorage_FTP_CreateDir($conn, $remoteDir);
        }
        
        // 上传文件
        if (ftp_put($conn, $remoteFile, $localFile, FTP_BINARY)) {
            ftp_close($conn);
            CommonCloudStorage_Log('FTP上传成功: ' . $remoteFile);
            
            // 返回完整的云存储URL
            return CommonCloudStorage_GetFTPUrl($remoteFile, $config);
        } else {
            ftp_close($conn);
            throw new Exception('FTP文件上传失败');
            return false;
        }
        
    } catch (Exception $e) {
        CommonCloudStorage_Log('FTP上传异常: ' . $e->getMessage());
        return false;
    }
}

/**
 * FTP删除文件 - 改进版，正确处理目录参数
 */
function CommonCloudStorage_FTP_Delete($localFile, $config) {
    try {
        $ftpHost = $config['bucket_name'];
        $ftpUser = $config['access_key'];
        $ftpPass = $config['secret_key'];
        $ftpPort = 21;
        
        if (strpos($ftpHost, ':') !== false) {
            list($ftpHost, $ftpPort) = explode(':', $ftpHost, 2);
        }
        
        $conn = ftp_connect($ftpHost, $ftpPort, 30);
        if (!$conn) {
            throw new Exception('无法连接到FTP服务器');
        }
        
        if (!ftp_login($conn, $ftpUser, $ftpPass)) {
            ftp_close($conn);
            throw new Exception('FTP登录失败');
        }
        
        ftp_pasv($conn, true);
        
        $relativePath = str_replace($GLOBALS['zbp']->path, '', $localFile);
        $relativePath = str_replace('\\', '/', $relativePath);
        $remoteFile = ltrim($relativePath, '/');
        
        // 处理目录参数 - 如果配置了目录，自动拼接
        if (!empty($config['directory'])) {
            $directory = trim($config['directory'], '/');
            if (!empty($directory)) {
                $remoteFile = $directory . '/' . $remoteFile;
            }
        }
        
        if (ftp_delete($conn, $remoteFile)) {
            ftp_close($conn);
            CommonCloudStorage_Log('FTP删除成功: ' . $remoteFile);
            return true;
        } else {
            ftp_close($conn);
            CommonCloudStorage_Log('FTP删除失败: ' . $remoteFile . ' (文件可能不存在)');
            return false;
        }
        
    } catch (Exception $e) {
        CommonCloudStorage_Log('FTP删除异常: ' . $e->getMessage());
        return false;
    }
}

/**
 * FTP连接测试 - 改进版，测试目录参数处理
 */
function CommonCloudStorage_FTP_Test($config) {
    try {
        $ftpHost = $config['bucket_name'];
        $ftpUser = $config['access_key'];
        $ftpPass = $config['secret_key'];
        $ftpPort = 21;
        
        if (strpos($ftpHost, ':') !== false) {
            list($ftpHost, $ftpPort) = explode(':', $ftpHost, 2);
        }
        
        $conn = ftp_connect($ftpHost, $ftpPort, 30);
        if (!$conn) {
            return array('success' => false, 'message' => '无法连接到FTP服务器: ' . $ftpHost . ':' . $ftpPort);
        }
        
        if (!ftp_login($conn, $ftpUser, $ftpPass)) {
            ftp_close($conn);
            return array('success' => false, 'message' => 'FTP登录失败，请检查用户名和密码');
        }
        
        // 设置被动模式
        ftp_pasv($conn, true);
        
        // 测试目录参数处理
        $testMessage = 'FTP连接成功，当前目录: ' . ftp_pwd($conn);
        
        // 如果配置了目录参数，测试目录创建功能
        if (!empty($config['directory'])) {
            $directory = trim($config['directory'], '/');
            if (!empty($directory)) {
                // 测试目录创建
                if (CommonCloudStorage_FTP_CreateDir($conn, $directory)) {
                    $testMessage .= '，目录参数处理正常';
                } else {
                    $testMessage .= '，目录参数处理可能存在权限问题';
                }
            }
        }
        
        ftp_close($conn);
        
        return array('success' => true, 'message' => $testMessage);
        
    } catch (Exception $e) {
        return array('success' => false, 'message' => 'FTP测试异常: ' . $e->getMessage());
    }
}

/**
 * 递归创建FTP目录 - 改进版，增强目录检测和创建
 */
function CommonCloudStorage_FTP_CreateDir($conn, $dir) {
    $dirs = explode('/', $dir);
    $currentDir = '';
    $success = true;
    
    foreach ($dirs as $d) {
        if (empty($d)) continue;
        
        $currentDir .= $d . '/';
        
        // 检查目录是否存在
        $dirExists = false;
        $currentPwd = @ftp_pwd($conn);
        
        // 尝试切换到目录来判断是否存在
        if (@ftp_chdir($conn, $currentDir)) {
            $dirExists = true;
            // 切换回原目录
            @ftp_chdir($conn, $currentPwd);
        } else {
            // 目录不存在，创建它
            if (@ftp_mkdir($conn, $currentDir)) {
                CommonCloudStorage_Log('FTP目录创建成功: ' . $currentDir);
            } else {
                // 创建失败，可能是权限问题或目录已存在
                CommonCloudStorage_Log('FTP目录创建失败或已存在: ' . $currentDir);
                $success = false;
            }
        }
    }
    
    // 确保回到根目录
    @ftp_chdir($conn, '/');
    
	return $success;
}

/**
 * 获取FTP文件URL
 */
function CommonCloudStorage_GetFTPUrl($remoteFile, $config) {
    $remoteFile = ltrim($remoteFile, '/');
    
    // 如果有配置目录参数，在域名后拼接目录
    $directory = '';
    if (!empty($config['directory'])) {
        $directory = trim($config['directory'], '/');
        if (!empty($directory)) {
            $directory .= '/';
        }
    }
    
    // 优先使用自定义域名
    if (!empty($config['custom_domain'])) {
        $domain = rtrim($config['custom_domain'], '/');
        return $domain . '/' . $directory . $remoteFile;
    }
    // 使用存储桶域名
    if (!empty($config['bucket_domain'])) {
        $domain = 'https://' . rtrim($config['bucket_domain'], '/');
        return $domain . '/' . $directory . $remoteFile;
    }
    // 如果没有配置域名，使用FTP服务器地址构建URL
    $ftpHost = $config['bucket_name'];
    if (strpos($ftpHost, ':') !== false) {
        list($ftpHost, $ftpPort) = explode(':', $ftpHost, 2);
    }
    return 'ftp://' . $ftpHost . '/' . $directory . $remoteFile;
}

/**
 * 检查FTP扩展是否可用
 */
function CommonCloudStorage_FTP_Available() {
    return function_exists('ftp_connect');
}

?>